package idx

import (
	"io"
)

// NewDatReader 创建一个读取流对象
func (f *FileDat) NewDatReader(offset int64, size int64) *FileDatReader {
	f.mux.Lock()
	defer f.mux.Unlock()
	//f.add()
	f.readRefIncr(1)
	return &FileDatReader{
		fd:     f,
		offset: offset,
		size:   size,
	}
}

// FileDatReader fileDat 读取对象
type FileDatReader struct {
	fd     *FileDat
	offset int64 //开始读取位置
	size   int64 //总共需要读取
	n      int64 //当前读取
}

func (f *FileDatReader) Read(b []byte) (n int, err error) {
	if f.size == f.n {
		return 0, io.EOF
	}
	if int64(len(b)) > f.size-f.n {
		buf := make([]byte, f.size-f.n)
		n, err = f.fd.fp.ReadAt(buf, f.offset+f.n)
		copy(b, buf)
	} else {
		n, err = f.fd.fp.ReadAt(b, f.offset+f.n)
	}
	f.n += int64(n)
	if f.n == f.size {
		err = io.EOF
	}
	if err != nil && err != io.EOF {
		err = ErrFileDat.Wrap(err)
	}
	return n, err
}

func (f *FileDatReader) Close() error {
	//f.file.done()
	f.fd.readRefIncr(-1)
	return nil
}
